#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
int main()
{
  pid_t id = fork();
  if(id == 0)
  {
    //child
    printf("I am a process my pid:%d\n",getpid());
    execl("/usr/bin/ls","ls","-a","-l",NULL);
    printf("you can see me!\n");
    printf("you can see me!\n");
    exit(0); 
  }
  //parent
  int status = 0;
  int ret = waitpid(id,&status,0);
  if(ret > 0)
  {
    //等待成功
    printf("father wait child success ! exit code:%d\n",(status>>8)&0xFF);
  }
  return 0;
}
//int main()
//{
//  printf("I am a process my pid:%d\n",getpid());
//  execl("/usr/bin/ls","ls","-a","-l",NULL);
//  printf("you can see me!\n");
//  printf("you can see me!\n");
//  printf("you can see me!\n");
//  printf("you can see me!\n");
//  printf("you can see me!\n");
//  return 0;
//}
////int main()
//{
//    pid_t id = fork();//创建子进程
//    if(id == 0)
//    {
//      //child
//      int count = 2;
//      while(count)
//      {
//        printf("child running pid:%d\n",getpid());
//        count-- ;
//        sleep(3);
//      }
//      exit(0);
//    }
//    //parent
//    //死循环等待子进程结束
//    while(1)
//    {
//      int status = 0;
//      pid_t ret = waitpid(id,&status,WNOHANG);//指定等待pid为id这个子进程结束 第三个参数设置为WNOHANG
//      if(ret > 0)
//      {
//        printf("father wait child success\n");
//        printf("exit code:%d\n",WEXITSTATUS(status));
//        break;//不需要再等待了
//      }
//      else if(ret == 0)
//      {
//        //子进程没有结束
//        printf("father do father things\n");  //父进程做自己的事情
//        sleep(1);
//      }
//      else 
//      {
//        //等待失败
//        printf("father wait child fail\n");
//        break;//等待失败直接退出
//      }
//    }
//    return 0;
//}
////int main()
//{
//    pid_t ids[10];
//    for(int i = 0;i<10;i++)
//    {
//        pid_t id = fork();
//        if(id == 0)
//        {
//            printf("Child process created Success  pid:%d\n",getpid());
//            sleep(3);
//            exit(i);
//        }
//        ids[i] = id;
//    }
//    for(int i = 0;i<10;i++)
//    {
//        int status = 0;
//        pid_t ret = waitpid(ids[i],&status,0);
//        if(ret>=0)
//        {
//            printf("father wait children success  pid:%d\n",ids[i]);
//            if(WIFEXITED(status))
//            {
//                printf("exit code:%d\n",WEXITSTATUS(status));
//            }
//            else
//            {
//                printf("kill by signal %d \n",status&0x7F);
//            }
//        }
//    }
//    return 0;
//}
////int main()
//{
//  pid_t id = fork();
//  if(id == 0)
//  {
//    //child
//    int count = 5;
//    while(count)
//    {
//      printf("child[%d] running, %d seconds\n",getpid(),count);
//      count --;
//      sleep(1);
//    }
//    exit(0);
//  }
//  //father
//  int status = 0;
//  pid_t ret = wait(NULL);//等待任意一个进程
//  if(ret > 0)
//  {
//    //等待成功
//    printf("father wait child[%d] success\n",ret);
//  }
//  else 
//  {
//    printf("father wait failed\n");
//  }
//  sleep(3);
//  return 0;
//}
////int main()
//{
//  pid_t id = fork();
//  if(id == 0){
//    //child
//  }
//  else if(id>0)
//  {
//    //parent
//  }
//  else 
//  {
//    //error
//  }
//  return 0;
//}
////int main()
//{
//  pid_t id = fork();
//  if(id == 0)
//  {
//    //child
//    int count = 5;
//    while(count)
//    {
//      printf("child[%d] is running %d seconds\n",getpid(),count);
//      sleep(1);
//      count--;
//    }
//    exit(6);
//  }
//  //基于轮巡检测的非阻塞等待
//  //parent
//  while(1)
//  {
//    int status = 0;
//    pid_t ret = waitpid(id,&status,WNOHANG);
//    if(ret > 0)
//    {
//      //watpid等待成功,子进程也退出了,获取到了对应的结果
//      printf("father wait for %d success,status :%d",ret,status);
//      printf("status exit code:%d status exit signal :%d \n",(status>>8)&0xFF,status&0x7F);
//      break;
//    }
//    else if(ret == 0)
//    {
//      //watpid等待成功,但是子进程没有退出,需要父进程重复进行等待
//      printf("child still running .do father's thing\n");
//      sleep(1);
//    }
//    else 
//    {
//      //ret < 0 ==>说明waitpid等待失败
//      perror("watpid");//打印错误信息
//      break;
//    }
//  }
//  return 0;
//}
////int main()
//{
//    pid_t id = fork();
//    if(id == 0)
//    {
//      //child
//      int count = 3;
//      while(count)
//      {
//        printf("child[%d]  running times:%d\n",getpid(),count);
//        sleep(1);
//        count--;
//      }
//      int a  = 10;
//      a/=0;
//      exit(1);
//    }
//    //parent
//    int status = 0;
//    pid_t ret = waitpid(-1,&status,0);//等待任意一个进程
//    if(ret > 0)
//    {
//      if(WIFEXITED(status))
//      {
//        //来到这里,说明没有接收到退出信号
//        //正常结束,获取对应的退出码
//        printf("exit code:%d\n",WEXITSTATUS(status));
//      }
//      else 
//      {
//        printf("error,get a exit signal\n");
//      }
//    }
//    sleep(3);
//    return 0;
//}
////int main()
//{
//  pid_t id = fork();
//  if(id == 0)
//  {
//    //child
//    int count = 3;
//    while(count)
//    {
//      printf("child[%d] running\n",getpid());
//      sleep(1);
//      count--;
//    }
//    exit(0);
//  }
//  //parent
//  sleep(6); //父进程先休眠6s
//  printf("father begin to wait\n");
//  pid_t ret = wait(NULL);
//  if(ret > 0)
//  {
//    printf("father wait for %d succes\n",ret);
//  }
//  else 
//  {
//    printf("father wait failed\n");
//  }
//  sleep(5);
//  return 0;
//}
////int main()
//{
//  printf("Hello Mango");
//  sleep(5);
//  _exit(2);
//}
//void show()
//{
//  printf("hello Linux");
//  exit(127);
//}
//int main()
//{
//  show();
//  printf("You can see me\n");
//  return 0;
//}
////int main()
//{
//  int a = 10;
//  a/=0;
//  printf("You can see me\n");
//  return 0;
//}
////int main()
//{
//  for(int i =0 ;i<150;i++)
//  {
//    printf("%d->%s\n",i,strerror(i));
//  }
//  return 0;
//}

//int main()
//{
//  printf("Now PID:%d PPID:%d\n",getpid(),getppid());
//  pid_t id = fork();
//  if(id<0)
//  {
//    exit(-1);//说明创建子进程失败
//  }
//  printf("After: PID:%d returnVal:%d\n",getpid(),id);
//  sleep(5);
//  return 0;
//}
